﻿using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.ComponentModel.DataAnnotations;

namespace Flagwind.ComponentModel
{
	/// <summary>
	/// 表示数据传输响应命令。
	/// </summary>
	public class ResponseInstruction<T> : IResponseInstruction
	{
		#region 私有字段

		private List<ValidationResult> _validationResults = new List<ValidationResult>();

		#endregion

		#region 公共属性

		/// <summary>
		/// 获取或设置响应状态。
		/// </summary>
		public ResponseStatus Status
		{
			get;
			set;
		}

		/// <summary>
		/// 获取或设置响应消息。
		/// </summary>
		public string Message
		{
			get;
			set;
		}

		/// <summary>
		/// 获取或设置响应内容。
		/// </summary>
		public T Result
		{
			get;
			set;
		}

		/// <summary>
		/// 获取或设置响应时间。
		/// </summary>
		public DateTime DateTime
		{
			get;
			set;
		}

		/// <summary>
		/// 获取响应包含的验证错误信息。
		/// </summary>
		public IEnumerable<ValidationResult> ValidationErrors
		{
			get
			{
				return _validationResults;
			}
		}

		/// <summary>
		/// 获取响应包含的异常信息。
		/// </summary>
		public Exception Exception
		{
			get;
			set;
		}

		#endregion

		#region 构造方法
		
		public ResponseInstruction() : this(ResponseStatus.Success)
		{

		}

		public ResponseInstruction(T result) : this(ResponseStatus.Success, result)
		{

		}

		public ResponseInstruction(ResponseStatus status, T result = default(T))
		{
			this.Status = status;
			this.Result = result;
			this.DateTime = DateTime.Now;
		}

		#endregion

		#region 公共方法

		/// <summary>
		/// 添加一条验证错误信息至响应中。
		/// </summary>
		/// <typeparam name="TDTO">数据传输对象类型。</typeparam>
		/// <param name="expression">具有错误的属性表达式。</param>
		/// <param name="message">错误消息。</param>
		public void AddValidationError<TDTO>(Expression<Func<TDTO, object>> expression, string message)
		{
//			this.AddValidationError(expression.GetPropertyName(), message);
		}

		/// <summary>
		/// 添加一条验证错误信息至响应中。
		/// </summary>
		/// <param name="property">具有错误的属性。</param>
		/// <param name="message">错误消息。</param>
		public void AddValidationError(string property, string message)
		{
			this.AddValidationError(new ValidationResult(message, new [] { property}));
		}

		/// <summary>
		/// 添加一条验证错误信息至响应中。
		/// </summary>
		/// <param name="error">验证失败的实例。</param>
		public void AddValidationError(ValidationResult error)
		{
			if(!this.Status.Equals(ResponseStatus.ValidationError))
				this.Status = ResponseStatus.ValidationError;

			this._validationResults.Add(error);
		}

		#endregion
	}
}
